/**
 * 轮询与倒计时工具类
 * 功能：统一管理轮询逻辑和实时倒计时显示
 */
class PollingUtil {
  /**
   * 构造函数
   * @param {Object} options - 配置参数
   * @param {Function} options.callback - 轮询回调函数（必传）
   * @param {number} [options.interval=3000] - 轮询间隔（毫秒，默认3000ms）
   * @param {Function} options.onCountdownUpdate - 倒计时更新回调（用于更新UI，必传）
   */
  constructor(options) {
    // 校验必填参数
    if (typeof options.callback !== 'function') {
      throw new Error('轮询回调函数（callback）必须提供');
    }
    if (typeof options.onCountdownUpdate !== 'function') {
      throw new Error('倒计时更新回调（onCountdownUpdate）必须提供');
    }

    // 初始化参数
    this.callback = options.callback; // 轮询执行的回调
    this.interval = options.interval > 0 ? options.interval : 3000; // 轮询间隔（毫秒）
    this.onCountdownUpdate = options.onCountdownUpdate; // 倒计时更新回调

    // 初始化状态变量
    this.pollTimer = null; // 轮询定时器ID
    this.countdownTimer = null; // 倒计时定时器ID
    this.remainingTime = Math.ceil(this.interval / 1000); // 剩余秒数（初始为间隔秒数）
  }

  /**
   * 开始轮询和倒计时
   */
  start() {
    // 先清除已有定时器，避免重复
    this.stop();

    // 立即执行一次轮询
    this.callback();

    // 启动轮询定时器
    this.pollTimer = setInterval(() => {
      this.callback();
      // 轮询触发后重置倒计时
      this.resetCountdown();
    }, this.interval);

    // 启动倒计时
    this.startCountdown();
  }

  /**
   * 启动倒计时
   */
  startCountdown() {
    // 清除旧的倒计时定时器
    if (this.countdownTimer) {
      clearInterval(this.countdownTimer);
    }

    // 立即触发一次倒计时更新（显示初始值）
    this.onCountdownUpdate(this.remainingTime);

    // 每秒更新一次倒计时
    this.countdownTimer = setInterval(() => {
      if (this.remainingTime > 0) {
        this.remainingTime--;
        this.onCountdownUpdate(this.remainingTime);
      }
    }, 1000);
  }

  /**
   * 重置倒计时（轮询触发后调用）
   */
  resetCountdown() {
    this.remainingTime = Math.ceil(this.interval / 1000);
    this.onCountdownUpdate(this.remainingTime);
  }

  /**
   * 修改轮询间隔（动态生效）
   * @param {number} newInterval - 新的轮询间隔（毫秒）
   */
  setInterval(newInterval) {
    if (newInterval <= 0) {
      console.warn('轮询间隔必须是正数，已忽略');
      return;
    }
    this.interval = newInterval;
    this.remainingTime = Math.ceil(newInterval / 1000);
    // 重启轮询使新间隔生效
    this.start();
  }

  /**
   * 停止轮询和倒计时
   */
  stop() {
    if (this.pollTimer) {
      clearInterval(this.pollTimer);
      this.pollTimer = null;
    }
    if (this.countdownTimer) {
      clearInterval(this.countdownTimer);
      this.countdownTimer = null;
    }
  }
}

module.exports = PollingUtil;